﻿using System;
using System.Collections.Generic;
using System.IO.Compression;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using ZYSocket;
using ZYSocket.Client;
using ZYSocket.FiberStream;

namespace TestClient
{
    class Program
    {
        static SocketClient client;

        static async Task Main(string[] args)
        {
            client = new SocketClient();
            client.BinaryInput += Client_BinaryInput;
            client.Disconnect += Client_Disconnect;

            while (true)
            {
                await connect();

                Console.ReadLine();

                client.ShutdownBoth();

                Console.ReadLine();
            }
        }

        static async Task connect()
        {
            var result = await client.ConnectAsync("127.0.0.1", 1002, 6000);
            Console.WriteLine(result);

            if (result.IsSuccess)
            {

                var fiber = await client.GetFiberRw();

                await SendTest(fiber);
            }

        }

        private static void Client_Disconnect(ISocketClient client, ISockAsyncEvent socketAsync, string msg)
        {
            Console.WriteLine(msg);
        }


        private static async Task SendTest(IFiberRw fiberRw)
        {
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);

            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);

            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("111111111111111111111111111111111111111111111111\r\n"), false);
            fiberRw.Write(System.Text.Encoding.Default.GetBytes("1\r\n"), false);



            await fiberRw.FlushAsync();
        }


        private static async void Client_BinaryInput(ISocketClient client, ISockAsyncEventAsClient socketAsync)
        {

           // USE SSL+GZIP
            var res = await socketAsync.GetFiberRwSSL<string>(null, "localhost", (input, output) =>
            {
                var gzip_input = new GZipStream(input, CompressionMode.Decompress, true);
                var gzip_output = new GZipStream(output, CompressionMode.Compress, true);
                return new GetFiberRwResult(gzip_input, gzip_output); //return gzip mode          

            });



            if (res.IsError)
            {
                Console.WriteLine(res.ErrMsg);
                client.ShutdownBoth(true);
                return;
            }

            var fiberRw = res.FiberRw;


            // var fiberRw = await socketAsync.GetFiberRw();

            client.SetConnected();



            while (true)
            {
                try
                {

                    await DataOnByLine(fiberRw);                 

                }
                catch
                {
                    break;
                }
            }

            client.ShutdownBoth();

        }



        static async ValueTask DataOnByLine(IFiberRw fiberRw)
        {
            using (var buffer = await fiberRw.ReadLine())
            {
                var str = System.Text.Encoding.Default.GetString(buffer.Value.Span);
                Console.WriteLine(str);
            }
        }


    }
}
